Visualização com ggplot2 - 2
1 Introdução
Os exercícios a seguir foram retirados do site https://www.yan-holtz.com/PDF/Ggplot2_basicTP.html. Esta lista contempla algumas funcionalidades básicas do ggplot2, além de fazer uso do pacote dplyr para a manipulação dos dados.
Para fazer esta lista, crie um notebook no Rstudio. Tente separar os exercícios em chunks e documentar os comentários/respostas pertinentes. Para realizar os exercícios, precisaremos carregar os pacotes ggplot2 e dplyr :
library(ggplot2)
library(dplyr)
# caso algum pacote não esteja instalado: install.packages(...)
Podemos, alternativamente, carregar a biblioteca tidyverse, que “contém” (dentre outros) os pacotes ggplot2 e dplyr:
library(tidyverse)
2 Correlação
Nesta secção, iremos abordar scatterplots e bubble plots, dois dos gráficos mais comuns para visualizar correlações entre variáveis.
2.1
Carrege o dataset gapminder, contido no pacote gapminder. Observe as primeiras 6 linhas com a função head() e descreva brevemente o que você observa. Quantas linhas este dataset tem? Utilize a função nrow():
# instale o pacote se necessário: install.packages(...)
# carregue o pacote
library(...)
# agora que você carregou o pacote, o objeto gapminder pode ser acessado. Dê uma olhada:
head(...)
# quantas linhas?
nrow(...)
2.2
Quantos anos estão disponíveis neste dataset? Quantas observações (“data-points”) existem para cada ano? Abaixo temos o código completo para responder a essas perguntas (lembre-se dos verbos do dplyr, e caso você não conheça alguma das funções, consulte help(...) ou ?...).
# Número de anos diferentes:
gapminder %>%
select(year) %>%
unique() %>%
nrow()
# número de países disponíveis por ano?
gapminder %>%
group_by(year)
summarize( n=n() )
2.3
Construa um scatterplot mostrando a relação entre gdpPercap e lifeExp em 1952. Utilize geom_point(). O que você observa?
# complete as lacunas
gapminder %>%
filter(year=="1952") %>%
ggplot( aes(x=..., y=...)) +
geom...
2.4
No gráfico anterior, um país se destaca. Qual? Complete o código abaixo para identificá-lo:
gapminder %>%
filter(...)
Você deverá obter algo como:
## # A tibble: 1 x 6
## country continent year lifeExp pop gdpPercap
## <fct> <fct> <int> <dbl> <int> <dbl>
## 1 Kuwait Asia 1952 55.6 160000 108382.
2.5
Agora, contrua o mesmo scatterplot, mas sem exibir este país. Você percebe alguma tendência? Qual? Ela faz sentido? O que poderia melhorar na visualização?
# complete:
gapminder %>%
filter(...) %>%
ggplot(...
Você deve obter um gráfico como este:
2.6
Colora os pontos de acordo com seus continentes (coluna continent). No parâmetro aes(), use o argumento color (lembre-se de recorrer ao help(ggplot) ou ?ggplot)
gapminder %>%
filter(...) %>%
ggplot( aes(..., color=...)) +
...
2.7
Vamos adicionar mais uma variável à nossa visualização: fazer o tamanho dos círculos proporcional à população do país (pop). Isto é feito utilizando o argumento size de aes().
2.8 Bônus
Agora, tente o seguinte:
- experimente o tema
theme_minimal()doggplot2 - adicione transparência para os círculos com o argumento
alphaemgeom_point() - ordene os dados por tamanho de população para colocar os círculos menores por cima dos maiores
- utilize a função
ggplotly()do pacoteplotlypara tornar este gráfico interativo
Você deverá obter algo como este gráfico:
3 Distribuições
Esta parte é dedicada à visualização de distribuições. Separaremos em duas partes:
- Visualizando uma distribuição
- Comparando distribuições para diversos grupos ou variáveis
3.1 Uma distribuição
Utilizaremos um dataset contendo o preço de AirBnb por noite de ~1000 residências na Riviera francesa. Os dados estão armazenados no Github, e podem ser carregados da seguinte forma:
# Carregando o dataset a partir do github
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/1_OneNum.csv", header=TRUE)3.1.1
O dataset contém quantas linhas? (use nrow()). Qual é o valor mínimo? E o máximo (utilize summary() )? Você observa algo estranho? Que tipo de gráfico você utilizaria para visualizar estes dados.
3.1.2
Construa um histograma com os dados, utilizando geom_histogram(). Você está satisfeito com o resultado? Como podemos melhorar?
data %>%
ggplot( aes(...)) +
geom_histogram()
3.1.3
Construa um histograma contemplando preços cima de 1500 euros. ggplot2 vai mostrar uma mensagem de erro, por quê? O que ela significa? Qual é a maior desvantagem deste histograma?
data %>%
fil.. %>%
gg...
3.1.4
Construa o histograma com diferentes valores de binwidth (a largura das barras), para preços menores que 400 euros. O que você observa? É importante “brincar” com este parâmetro?
...
geom_histogram(binwidth = ...)
3.1.5
Utilize geom_density() para construir um gráfico de densidade. Utilize o argumento fill para escolher a cor. Utilize o help() para descobrir qual é o equivalente de binwidth para o gráfico de densidade. Observe o efeito para diferentes valores.
3.2 Várias distribuições
Para esta secção, utilizaremos outro dataset armazenado no Github. Perguntas como Que probabilidade você designaria à frase Altamente provável foram respondidas em uma escala de 0-100. Estes dados nos permitem entender como as pessoas percebem o vocabulário de probabilidades. vamos carregar este dataset da seguinte forma:
# carregando os dados
data <- read.table("https://raw.githubusercontent.com/holtzy/Teaching/master/DATA/probability.csv", header=TRUE, sep=",")3.2.1
Como de costume, verifique as principais características destes dados com nrow(), head(), summary() ou qualquer outra função que você considere útil.
3.2.2
Que tipo de gráfico você utilizaria para compara as 8 categorias?
3.2.3
Construa um boxplot simples, utilizando o default de geom_boxplot()
data %>%
ggplot( aes(x=..., y=..., fil=...)) +
geom_boxplot()
3.2.4
O que você observa? Você consegue melhorar este gráfico? O que você mudaria? Você lembra o que cada parte do “box” representa?
3.2.5
Adicione as seguintes modificações ao gráfico anterior: * ordenar os grupos em ordem crescente da mediana da coluna value. Isto é feito utilizando o pacote forcats * inverter os eixos X e Y (coord_flip()) * elimine a legenda (theme)
library(forcats) # desnecessário se você utilizou library(tidyverse)
data %>%
mutate(text = fct_reorder(text, value, .fun = median)) %>%
ggplot( aes(...)) +
geom_box... +
theme( ... ) +
...
3.2.6
Qual é a desvantagem deste boxplot? Como podemos melhorá-lo?
3.2.7
Vamos agora mostrar as observações individualmente utilizando geom_jitter(). Explique o que esta função faz. Tente conseguir um bom gráfico utilizando as opções width, size, alpha e color.
data %>%
mutate(text = fct_reorder(text, value, .fun = median)) %>%
ggplot(aes(x=text, y=value, fill=text)) +
geom_boxplot() +
geom_jitter(color="grey", width=.4, size=.5, alpha=.8) +
theme(
legend.position = "none"
) +
coord_flip()3.2.8 Bônus
- construa um violin plot com
geom_violin() - descubra como adicionar um círculo vermelho representando a média de cada grupo
- faça uma busca na internet para construir um ridgeline chart
4 Ranqueamento
Nesta seção iremos utilizar os dados dos 50 maiores exportadores de armas (em 2017). Este dataset está disponível no github. Carregando os dados:
# Carregando o dataset do github
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/7_OneCatOneNum.csv", header=TRUE, sep=",")4.1
Dê uma olhada nos dados, e descreva-os. Quais gráficos podem ser utilizados para vizualisar estes dados? Qual seria o melhor, na sua opinião? Quais países estão no topo do ranking?
4.2
Comece com um gráfico de barras básico utlizando geom_bar(). Observação: por default geom_bar() aceita uma variável categórica como entrada, utilizada no eixo x, e conta o número de casos a cada posição x exibindo os no eixo y. No nosso caso, queremos um valor de y para cada grupo, por isso precisamos especificar stat="identity".
data %>%
ggplot( ... ) +
geom_bar(stat="identity")
4.3
Colora todas as barras com a mesma cor: #69b3a2. Não gostou da cor? Escolha outra. Você tem que utilizar fill ou color? Por quê?
4.4
Escolha uma cor diferente para cada barra. Você gosta do resultado? Ele é útil? Você entende a diferença entre adicionar a opção de cor dentro ou fora de aes()?
4.5
Os gráficos anteriores não são ideais, certo? O que você pode melhorar?
4.6
Tente o seguinte:
utilize
coord_flip()para obter uma versão horizontalobserve o código abaixo para reordenar os países:
data %>%
# reorganizar os dados
arrange(Value) %>%
mutate(Country=factor(Country,Country)) %>%
# faça o gráfico
...
você deve obter algo como:
4.7
Um lollipop plot é utilizado sob as mesmas circunstâncias que um gráfico de barras. Contrua um com:
geom_segment()para as linhas. Argumentos necessários sãox,xend,yeyend.geom_point()para os círculos.
você deve obter:
4.8 Bônus
- Melhore o gráfico anterior com o tema
theme_minimal. - Pesquise treemaps. Aplique este gráfico para os dados acima. Você deve obter algo como o gráfico abaixo:
- Pesquise o que é um gráfico de barras circular (circular barchart). Quais são seus prós e contras? Tente implementá-lo em R e com
ggplot2.
5 Evolução
Vamos considerar a evolução do preço de bitcoins entre Abril de 2013 e Abril de 2018. Os dados estão disponíveis no github. Carregue o dataset utilizando o código:
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", header=T)
data$date <- as.Date(data$date)5.1
Construa um gráfico básico mostrando a evolução dos preços de bitcoin utilizando geom_line().
data %>%
ggplot(...) +
geom_line()
5.2
Faça agora um gráfico de área utilizando geom_area(). Utilize color e fill para customizar as cores do gráfico.
5.3
Selecione os últimos 10 valores utilizando tail(). Construa um scatterplot conectado (pontos ligados por linhas), com geom_point(), geom_line() e geom_area().
5.4 Bônus
Pesquise séries temporais. Tente utilizar o widget HTML dygraph para construir uma versão interativa deste gráfico. Você deve obter algo como: